package com.example.services.impl;

import cn.hutool.core.util.StrUtil;
import cn.hutool.json.JSONUtil;
import com.example.dto.Result;
import com.example.entity.ShopType;
import com.example.mapper.ShopTypeMapper;
import com.example.services.IShopTypeService;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import jakarta.annotation.Resource;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.stereotype.Service;

import java.util.List;
import java.util.concurrent.TimeUnit;

import static com.example.utils.RedisConstants.CACHE_SHOP_TYPE_TTL;
import static com.example.utils.RedisConstants.CACHE_SHOP_TYPE_KEY;

/**
 * 服务实现类
 */
@Service
public class ShopTypeServiceImpl extends ServiceImpl<ShopTypeMapper, ShopType> implements IShopTypeService {

    @Resource
    private StringRedisTemplate stringRedisTemplate;

    /**
     * 查询店铺类型列表
     * String存储写法
     */
    @Override
    public Result queryTypeList() {
        // 从redis中查询店铺类型数据
        String shopTypeJson = stringRedisTemplate.opsForValue().get(CACHE_SHOP_TYPE_KEY);
        List<ShopType> shopTypeList = null;
        // 判断缓存是否命中
        if (StrUtil.isNotBlank(shopTypeJson)) {
            // 缓存命中，直接返回缓存数据
            shopTypeList = JSONUtil.toList(shopTypeJson, ShopType.class);
            return Result.ok(shopTypeList);
        }
        // 缓存未命中，查询数据库
        shopTypeList = this.query().orderByAsc("sort").list();
        // 判断数据库中是否存在该数据
        if (shopTypeList == null) {
            // 数据库中不存在该数据，返回失败信息
            return Result.fail("店铺类型不存在！");
        }
        // 数据库中的数据存在，写入redis，并返回查询的数据
        stringRedisTemplate.opsForValue().set(CACHE_SHOP_TYPE_KEY, JSONUtil.toJsonStr(shopTypeList), CACHE_SHOP_TYPE_TTL, TimeUnit.MINUTES);
        // 将数据库查到的数据返回
        return Result.ok(shopTypeList);
    }

    /**
     * 查询店铺类型列表
     * List存储写法
     * 存在错误尚未解决
     */
//    @Override
//    public Result queryTypeList() {
//        // 从redis中查询店铺类型数据
//        ListOperations<String, String> ops = stringRedisTemplate.opsForList();
//        List<ShopType> shopTypeList;
//        // 0到-1表示查询List中所有元素
//        List<String> shopTypeJsonList = ops.range(CACHE_SHOP_TYPE_KEY, 0, -1);
//        // 判断缓存是否命中
//        if (CollUtil.isNotEmpty(shopTypeJsonList)) {
//            // 缓存命中，直接返回缓存数据
//            shopTypeList = shopTypeJsonList.stream()
//                    // 将 List<String> 转换为 List<ShopType> 返回
//                    .map((shopTypeJson) -> JSONUtil.toBean(shopTypeJson, ShopType.class))
//                    .collect(Collectors.toList());
//            return Result.ok(shopTypeList);
//        }
//        // 缓存未命中，查询数据库
//        shopTypeList = this.query().orderByAsc("sort").list();
//        // 判断数据库中是否存在该数据
//        if (shopTypeList == null) {
//            // 数据库中不存在该数据，返回失败信息
//            return Result.fail("店铺类型不存在！");
//        }
//        // 数据库中的数据存在，写入redis，并返回查询的数据
//        ops.rightPushAll(CACHE_SHOP_TYPE_KEY, shopTypeList.stream().map(JSONUtil::toJsonStr).collect(Collectors.toList()));
//        // 设置key的过期时间
//        stringRedisTemplate.expire(CACHE_SHOP_TYPE_KEY, CACHE_SHOP_TYPE_TTL, TimeUnit.MINUTES);
//        // 将数据库查到的数据返回
//        return Result.ok(shopTypeList);
//    }

}
